Service Discovery

@Wonyu· February 18, 2025 · 4 min read

서비스 인스턴스를 자동으로 등록하고 검색 가능
IP 주소가 동적으로 변경되어도 항상 최신 정보를 제공
service discovery server Netflix Eureka는 Netflix OSS(Open Source Software)에서 제공하는 Service Discovery(서비스 디스커버리) 서버 및 클라이언트 라이브러리
마이크로서비스 환경에서 동적으로 서비스 인스턴스를 등록하고 검색할 수 있도록 도움

📌 Netflix Eureka 구성 요소

Eureka는 클라이언트/서버 아키텍처로 구성되며, Eureka ServerEureka Client로 구분

구성 요소 역할
Eureka Server 서비스 등록 및 검색을 관리하는 중앙 서버
Eureka Client Eureka Server에 서비스 등록 및 조회하는 클라이언트

Eureka Server는 독립적인 서비스로 실행되며, Eureka Client가 이를 사용하여 서비스를 등록하고 조회


Eureka Server

✅ Netflix에서 제공하는 Servcie Discovery Server 라이브러리
✅ MSA에서 서비스 등록 및 검색 기능 제공

📌 Netflix Eureka Server의 역할

서비스 등록: 마이크로서비스가 실행되면서 Eureka Server에 자신을 등록
서비스 검색: 마이크로서비스가 Eureka Server에서 다른 서비스의 위치(IP, 포트)를 조회
헬스 체크

  • 서비스가 정상적으로 실행되고 있는지 주기적으로 상태를 체크(heartbeat)
  • 일정 시간 응답이 없으면 자동으로 해당 서비스 제거

📌 Netflix Eureka Server 설정 및 실행

build.gradle

implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'

✅ .java

@SpringBootApplication  
@EnableEurekaServer  
public class DiscoveryserviceApplication {  
  
    public static void main(String[] args) {  
        SpringApplication.run(DiscoveryserviceApplication.class, args);  
    }  
  
}

@EnableEurekaServer: 해당 서버를 discovery service로 지정

✅ 설정 파일

server:  
  port: 8761  
spring:  
  application:  
    name: discoveryservice  
eureka:  
  client:  
    register-with-eureka: false  
    fetch-registry: false
  • application.name: 해당 애플리케이션 서버의 이름(고유한 id)
  • register-with-eureka: discovery service에 client로 등록할 것인지에 대한 설정값
  • fetch-registry: 다른 서비스의 정보를 가져오는지 여부

✅ 서버 실행 1

  • Eureka Server에서 제공하는 대시보드 조회 가능
  • 어떤 인스턴스가 등록되었는지 확인 가능

Netflix Eureka Client

✅ Eureka Server에 자신을 등록하고, 다른 서비스의 위치를 조회 가능

📌 Netflix Eureka Client 설정 및 실행

build.gradle

implementation 'org.springframework.boot:spring-boot-starter-web'  
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'

설정 파일

server:  
  port: 9001
spring:  
  application:  
    name: user-service
  
eureka:
  client:  
    fetch-registry: true  
    register-with-eureka: true  
    service-url:  
      defaultZone: http://localhost:8761/eureka
  • application.name: 해당 애플리케이션 서버의 이름(고유한 id)
  • register-with-eureka: discovery service에 client로 등록
  • fetch-registry: 다른 서비스의 정보를 가져올 것

서버 실행 2

  • 인스턴스가 정상적으로 등록
  • 현재는 port가 명시적으로 지정되어 있기 때문에 Scale Out 시 여러 User Service 인스턴스를 등록할 수 없다.

📌 Random Port 설정

✅ 설정 파일

server:  
  port: 0  
spring:  
  application:  
    name: user-service  
  
eureka:  
  instance:  
    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}  
  client:  
    fetch-registry: true  
    register-with-eureka: true  
    service-url:  
      defaultZone: http://localhost:8761/eureka
  • server.port : 0: 사용 가능한 포트를 자동 할당
  • instance-id

    • Eureka는 기본적으로 host ip : service name : port를 기준으로 서비스 인스턴스를 등록
    • 동일한 User Service를 여러 개 실행하면 위 값이 동일하여 문제 발생 가능
    • 이를 해결하기 위해 instance-id를 고유한 값으로 설정하여 각 인스턴스를 개별적으로 인식

✅ 서버 실행 3

  • 두 user-service 인스턴스가 정상적으로 등록
@Wonyu
Hello :) I'm Wonyu